// 纯函数
// 固定的输入有固定的输出
// 没有副作用

let min = 18;
// 如果超过最小年龄，就是合法年龄
function isLegalAge(age) {
  return age >= min;
}

console.log(isLegalAge(20)); // -> true

min = 25;

console.log(isLegalAge(20)); // -> false

// 从上面的结果可以看出，对于同一输入，输出结果不一样，因此isLegalAge不是一个纯函数

// 因为isLegalAge函数依赖了外部可以变化的 min，这也叫做副作用，有副作用的函数一定不是纯函数

// 改进版本1：硬编码
function isLegalAge1(age) {
  let min = 18;
  return age >= min;
}

console.log(isLegalAge1(20)); // -> true
console.log(isLegalAge1(20)); // -> true

// 但是上面版本会有这样一个问题，就是当我们某一天需要对min做修改的时候，我们就会去改动原来的代码，函数我们约尽量提倡对内闭合，对外开放的原则
// 同时，可能各个地方对于 min的值也会存在不一样

// 改进版本2: 高阶函数
function isLegalAge2(min) {
  return function (age) {
    return age >= min;
  };
}

const isLegalAge18 = isLegalAge2(18);

console.log(isLegalAge18(20)); // -> true
console.log(isLegalAge18(20)); // -> true

const isLegalAge25 = isLegalAge2(25);

console.log(isLegalAge25(20)); // -> false
console.log(isLegalAge25(20)); // -> false

// 补充：纯函数的好处

/**
 * 1、可以有效的实现缓存
 * 2、方便单元测试
 * 3、便于任务的并行
 */
